package org.cybzacg.convert.converters.numeric;

import org.cybzacg.convert.annotation.Converter;
import org.cybzacg.convert.context.ConversionContext;
import org.cybzacg.convert.enums.ConversionError;
import org.cybzacg.convert.enums.ConversionPriority;
import org.cybzacg.convert.enums.ConversionType;
import org.cybzacg.convert.exception.ConversionException;
import lombok.extern.slf4j.Slf4j;

/**
 * 整型转换器
 * 
 * <p>
 * 专门处理int和Integer类型的转换。
 * 继承自 {@link AbstractNumericConverter}，复用通用数值转换逻辑。
 * 
 * <p>
 * 支持的转换：
 * <ul>
 * <li>Number类型 → Integer</li>
 * <li>String → Integer</li>
 * <li>Boolean → Integer (true=1, false=0)</li>
 * <li>Character → Integer (字符码)</li>
 * </ul>
 * 
 * <p>
 * 范围验证：自动检查数值是否在Integer范围内（-2^31 到 2^31-1）
 *
 * @author cybzacg.blog
 * @version 4.0
 * @since 3.0
 */
@Slf4j
@Converter(name = "IntegerConverter", priority = ConversionPriority.HIGH, description = "整型转换器，专门处理int和Integer类型的转换", enabled = true, version = "4.0", author = "cybzacg.blog", supportedTypes = {
        Integer.class, int.class }, tags = { "integer", "numeric", "basic", "conversion" })
public class IntegerConverter extends AbstractNumericConverter<Integer> {

    /**
     * 构造函数
     */
    public IntegerConverter() {
        super(Integer.class);
    }

    @Override
    protected ConversionType getConversionType() {
        return ConversionType.INTEGER;
    }

    /**
     * 范围验证
     * 
     * <p>
     * 检查转换前的数值是否在Integer范围内
     *
     * @param sourceNumber 源数值
     * @param result       转换结果
     * @param context      转换上下文
     * @throws ConversionException 如果数值超出Integer范围
     */
    @Override
    protected void validateRange(Number sourceNumber, Object result, ConversionContext context)
            throws ConversionException {

        // 对于Long和BigInteger类型，检查范围
        if (sourceNumber instanceof Long || sourceNumber instanceof java.math.BigInteger) {
            long value = sourceNumber.longValue();
            if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {
                throw new ConversionException(ConversionError.NUMBER_OVERFLOW,
                        String.format("数值超出Integer范围: %d (范围: %d 到 %d)",
                                value, Integer.MIN_VALUE, Integer.MAX_VALUE));
            }
        }
    }
}
